package com.rbac.web.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.rbac.web.cache.CrudService;
import com.rbac.web.common.Constant;
import com.rbac.web.db.SysParamCodeDAO;
import com.rbac.web.db.SysParamCodeDO;
import com.rbac.web.model.SysParamCode;
import com.rbac.web.service.ISysParamCodeService;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

/**
 * @author gengaoliu
 */
@Service
@Slf4j
public class SysParamCodeServiceImpl extends CrudService
    implements ISysParamCodeService {

  private final SysParamCodeDAO dao;

  public SysParamCodeServiceImpl(SysParamCodeDAO dao) {
    this.dao = dao;
  }

  @Override
  public String getRedisConf(String typeCode, String paramCode, String columnValue) {
    if (!StringUtils.hasLength(typeCode) || !StringUtils.hasLength(paramCode)) {
      return null;
    }
    List<SysParamCodeDO> sysParamCodeDOList = this.getSysCodes(typeCode, paramCode);
    if (CollectionUtils.isEmpty(sysParamCodeDOList)) {
      return null;
    }
    Optional<SysParamCode> sysParamCode =
        sysParamCodeDOList.stream()
            .filter(x -> columnValue.equals(x.getColumnValue()))
            .map(SysParamCodeDO::to)
            .findFirst();
    return sysParamCode.map(SysParamCode::getColumnDesc).orElse(null);
  }

  @Override
  public SysParamCode findById(Integer id) {
    return Optional.ofNullable(dao.selectById(id)).map(SysParamCodeDO::to).orElse(null);
  }

  private List<SysParamCodeDO> getSysCodes(String typeCode, String paramCode) {
    String redisKey = Constant.getRBKey() + typeCode + "." + paramCode;
    String dimCode = typeCode + "." + paramCode;
    Function<String, List<SysParamCodeDO>> getFunData =
        (String _dimCode) -> {
          String[] codes = _dimCode.split("\\.");
          String _typeCode = codes[0];
          String _paramCode = codes[1];
          log.info("===>查询系统参数表typeCode：{},paramCode：{}", _typeCode, _paramCode);
          return dao.selectList(
              Wrappers.<SysParamCodeDO>lambdaQuery()
                  .eq(SysParamCodeDO::getParamCode, _paramCode)
                  .eq(SysParamCodeDO::getTypeCode, _typeCode));
        };
    return super.findListByCache(redisKey, dimCode, getFunData);
  }
}
